package com.atguigu.config;

import com.atguigu.bean1.Car;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

import java.util.Calendar;

/**
 * bean生命周期
 *      创建--初始化--销毁
 *
 * 容器管理bean生命周期
 * 可以自定义初始化和销毁方法，容器执行到生命周期环节的时候对应调用
 *
 * 初始化和销毁===
 * 1.指定初始化和销毁方法
 * 通过@Bean initMethod destroyMethod
 *
 * 2.通过让bean实现InitializingBean.afterPropertiesSet接口，定义赋值完成后的初始化逻辑
 *                  DisposableBean.destroy 定义销毁逻辑
 *
 * 3.使用jsr250规范注解
 *      @PostConstruct bean创建并初始化完成后执行初始化方法
 *      @PreDestroy 容器bean销毁之前进行清理
 *
 * 4。BeanPostProcessor后置处理器接口，在bean初始化前后进行一些操作
 *      postProcessBeforeInitialization在任何初始化调用之前
 *      postProcessAfterInitialization在任何初始化调用之后
 *
 *
 * 生命周期===
 * <p>
 * 构造（对象创建）
 *      单例：容器启动时创建
 *      多例：获取时创建
 *
 * BeanPostProcessor.postProcessBeforeInitialization
 * 初始化：
 *      对象创建》》》赋值》》》调用初始化方法
 * BeanPostProcessor.postProcessAfterInitialization
 *
 * 销毁：
 *      单例：容器关闭时销毁
 *      多例：容器不进行管理
 * <p>
 *
 * 后置处理器底层===
 * 遍历容器中所有BeanPostProcessor，依次执行BeforeInitialization，一旦返回null则跳出，不执行后面的后置处理器
 * populateBean(beanName, mbd, instanceWrapper);//bean属性赋值
 * {
 *    applyBeanPostProcessors.BeforeInitialization(wrappedBean, beanName);
 *    invokeInitMethods(beanName, wrappedBean, mbd);
 *    applyBeanPostProcessors.AfterInitialization(wrappedBean, beanName);
 * }
 * Spring底层对 BeanPostProcessor 的使用===
 *      bean赋值、注入其他组件、@autowired、生命周期@PostConstructor、@Async等都有对应的xxxBeanProcessor
 *
 *
 *

 */

@Configuration
@ComponentScan("com.atguigu.bean1")
public class MainConfig3 {

    //@Scope("prototype")
    @Bean(initMethod = "init", destroyMethod = "destroy")
    public Car car() {
        return new Car();
    }
}
